package it.gat.client.view;

import it.gat.controller.PermessoController;
import it.gat.controller.TipologiaDispositivoController;
import it.gat.controller.UtenteController;
import it.gat.model.Cliente;
import it.gat.model.GruppoUtentiEnum;
import it.gat.model.Operatore;
import it.gat.model.Permesso;
import it.gat.model.TipologiaDispositivo;
import it.gat.model.Utente;

import java.awt.Container;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JPanel;

import javax.swing.JButton;
import javax.swing.JTable;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JCheckBox;
import javax.swing.JPasswordField;
import javax.swing.JSeparator;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;

public class UtenteInternalFrame extends JInternalFrame implements IClientiSelection{
	private JTextField txtNomeUtente;
	private JTextField txtCognome;
	private JTextField txtTelefono;
	private JTextField txtCellulare;

	private JInternalFrame that;
	private Utente utente;
	private Cliente clienteSelected;
	private List<Permesso> permessiLista;
	private List<Permesso> permessi;
	private JTextField txtNome;
	private JPasswordField txtPassword;
	private JTextField txtRagioneSociale;
	private JTable tablePermessi;
	private JTable tableTipologie;
	private JCheckBox chkAbilitato;
	private JButton btnCliente;
	private JSeparator separator;
	private JScrollPane scrollPaneTipologie;
	private JLabel lblTipologie;
	private JComboBox cmbGruppo;
	private JScrollPane scrollPaneGruppi;
	private JPanel panelCliente;
	private JPanel panelTecnico;
	private List<TipologiaDispositivo> tipologie;
	private List<TipologiaDispositivo> tipologieLista;
	private IClientiSelection thisCallerClientiSelection=this;
	private TableModel model;
	private TableModel modelTipologie;

	/**
	 * Create the frame.
	 */
	public UtenteInternalFrame(String title,final boolean edit,final Container desktop,final UtentiInternalFrame frame) {
		super(title);
		setBounds(0, 0, 656, 468);
		getContentPane().setLayout(null);
		that = this;

		JLabel lblNewLabel = new JLabel("Nome Utente");
		lblNewLabel.setBounds(10, 11, 75, 14);
		getContentPane().add(lblNewLabel);

		JLabel lblCognome = new JLabel("Cognome");
		lblCognome.setBounds(10, 64, 75, 14);
		getContentPane().add(lblCognome);

		JLabel lblTelefono = new JLabel("Telefono");
		lblTelefono.setBounds(10, 117, 75, 14);
		getContentPane().add(lblTelefono);

		JLabel lblCellulare = new JLabel("Cellulare");
		lblCellulare.setBounds(10, 142, 75, 14);
		getContentPane().add(lblCellulare);

		txtNomeUtente = new JTextField();
		txtNomeUtente.setBounds(95, 8, 119, 20);
		getContentPane().add(txtNomeUtente);
		txtNomeUtente.setColumns(10);

		txtCognome = new JTextField();
		txtCognome.setColumns(10);
		txtCognome.setBounds(95, 61, 202, 20);
		getContentPane().add(txtCognome);

		txtTelefono = new JTextField();
		txtTelefono.setColumns(10);
		txtTelefono.setBounds(95, 114, 112, 20);
		getContentPane().add(txtTelefono);

		txtCellulare = new JTextField();
		txtCellulare.setColumns(10);
		txtCellulare.setBounds(95, 139, 112, 20);
		getContentPane().add(txtCellulare);

		JButton btnSalva = new JButton("Salva");
		btnSalva.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (!edit)
				{
					UtenteController ac = new UtenteController();
					GruppoUtentiEnum gruppo = GruppoUtentiEnum.valueOf(((String)cmbGruppo.getSelectedItem()).toUpperCase());
					Utente utente = null;
					switch (gruppo)
					{
					case OPERATORI:
						utente = new Operatore();
						break;
					case TECNICI:
						utente = new Operatore();
						break;
					case CLIENTI:
						utente = new Cliente();
						break;
					case AMMINISTRATORI:
						utente = new Operatore();
					}
					utente.setNomeUtente(txtNomeUtente.getText());
					utente.setPassword(String.valueOf(txtPassword.getPassword()));
					utente.setCognome(txtCognome.getText());
					utente.setNome(txtNome.getText());
					utente.setAbilitazione(chkAbilitato.isSelected());
					if (utente instanceof Cliente)
						((Cliente) utente).setIdCliente(clienteSelected.getIdCliente());
					utente.setTelefono(txtTelefono.getText());
					utente.setCellulare(txtCellulare.getText());
					utente.setGruppo(gruppo);
					List<Permesso> permessiUtente = new ArrayList<Permesso>();
					utente.setPermessi(permessiUtente);
					for(int i=0;i<tablePermessi.getRowCount();i++)
					{
						if ((Boolean) tablePermessi.getValueAt(i, 1))
							permessiUtente.add(permessiLista.get(i));
					}
					if (utente instanceof Operatore)
					{
						List<TipologiaDispositivo> tipologieUtente = new ArrayList<TipologiaDispositivo>();
						((Operatore) utente).setTipologieDispositivi(tipologieUtente);
						for(int i=0;i<tableTipologie.getRowCount();i++)
						{
							if ((Boolean) tableTipologie.getValueAt(i, 1))
								tipologieUtente.add(tipologieLista.get(i));
						}
					}
					ac.insertUtente(utente);
					frame.refresh();
					try {
						that.setClosed(true);
					} catch (PropertyVetoException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
				else
				{
					UtenteController ac = new UtenteController();
					utente.setNomeUtente(txtNomeUtente.getText());
					utente.setPassword(String.valueOf(txtPassword.getPassword()));
					utente.setCognome(txtCognome.getText());
					utente.setNome(txtNome.getText());
					utente.setAbilitazione(chkAbilitato.isSelected());
					if (utente instanceof Cliente)
						((Cliente) utente).setIdCliente(clienteSelected.getIdCliente());
					utente.setTelefono(txtTelefono.getText());
					utente.setCellulare(txtCellulare.getText());
					List<Permesso> permessiUtente = new ArrayList<Permesso>();
					utente.setPermessi(permessiUtente);
					for(int i=0;i<tablePermessi.getRowCount();i++)
					{
						if ((Boolean) tablePermessi.getValueAt(i, 1))
							permessiUtente.add(permessiLista.get(i));
					}
					if (utente instanceof Operatore)
					{
						List<TipologiaDispositivo> tipologieUtente = new ArrayList<TipologiaDispositivo>();
						((Operatore) utente).setTipologieDispositivi(tipologieUtente);
						for(int i=0;i<tableTipologie.getRowCount();i++)
						{
							if ((Boolean) tableTipologie.getValueAt(i, 1))
								tipologieUtente.add(tipologieLista.get(i));
						}
					}
					ac.updateUtente(utente);
					frame.refresh();
					try {
						that.setClosed(true);
					} catch (PropertyVetoException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		});
		btnSalva.setBounds(442, 405, 89, 23);
		getContentPane().add(btnSalva);

		JButton btnAnnulla = new JButton("Annulla");
		btnAnnulla.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int n = JOptionPane.showConfirmDialog(
						desktop,
						"Sei sicuro di uscire?",
						"Conferma",
						JOptionPane.YES_NO_OPTION,
						JOptionPane.QUESTION_MESSAGE);
				if (n==JOptionPane.YES_OPTION)
				{
					try {
						that.setClosed(true);
					} catch (PropertyVetoException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		btnAnnulla.setBounds(541, 405, 89, 23);
		getContentPane().add(btnAnnulla);

		JLabel lblNome = new JLabel("Nome");
		lblNome.setBounds(10, 89, 75, 14);
		getContentPane().add(lblNome);

		txtNome = new JTextField();
		txtNome.setColumns(10);
		txtNome.setBounds(95, 86, 202, 20);
		getContentPane().add(txtNome);

		chkAbilitato = new JCheckBox("Abilitato");
		chkAbilitato.setBounds(242, 7, 97, 23);
		getContentPane().add(chkAbilitato);

		JLabel lblPassword = new JLabel("Password");
		lblPassword.setBounds(10, 36, 75, 14);
		getContentPane().add(lblPassword);

		txtPassword = new JPasswordField();
		txtPassword.setColumns(10);
		txtPassword.setBounds(95, 33, 119, 20);
		getContentPane().add(txtPassword);

		separator = new JSeparator();
		separator.setBounds(10, 200, 620, 2);
		getContentPane().add(separator);

		JLabel lblGruppo = new JLabel("Gruppo");
		lblGruppo.setBounds(10, 167, 75, 14);
		getContentPane().add(lblGruppo);

		cmbGruppo = new JComboBox();
		cmbGruppo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (cmbGruppo.getSelectedItem().equals("Operatori"))
				{
					panelTecnico.setVisible(false);
					panelCliente.setVisible(false);
					setPermessiDefaultOperatori();
				}
				if (cmbGruppo.getSelectedItem().equals("Tecnici"))
				{
					panelTecnico.setVisible(true);
					panelCliente.setVisible(false);
					setPermessiDefaultTecnici();
				}
				if (cmbGruppo.getSelectedItem().equals("Clienti"))
				{
					panelTecnico.setVisible(false);
					panelCliente.setVisible(true);
					setPermessiDefaultClienti();
				}
				if (cmbGruppo.getSelectedItem().equals("Amministratori"))
				{
					panelTecnico.setVisible(false);
					panelCliente.setVisible(false);
					setPermessiDefaultAmministratori();
				}
			}
		});
		cmbGruppo.setModel(new DefaultComboBoxModel(new String[] {"Operatori", "Tecnici", "Clienti", "Amministratori"}));
		cmbGruppo.setBounds(95, 164, 115, 20);
		getContentPane().add(cmbGruppo);

		scrollPaneGruppi = new JScrollPane();
		scrollPaneGruppi.setBounds(350, 11, 280, 178);
		getContentPane().add(scrollPaneGruppi);

		panelTecnico = new JPanel();
		panelTecnico.setVisible(false);

		panelCliente = new JPanel();
		panelCliente.setBounds(10, 224, 620, 170);
		getContentPane().add(panelCliente);
		panelCliente.setVisible(false);
		panelCliente.setLayout(null);

		JLabel lblRagioneSociale = new JLabel("Cliente");
		lblRagioneSociale.setBounds(0, 4, 75, 14);
		panelCliente.add(lblRagioneSociale);

		txtRagioneSociale = new JTextField();
		txtRagioneSociale.setBounds(52, 2, 395, 20);
		panelCliente.add(txtRagioneSociale);
		txtRagioneSociale.setEditable(false);
		txtRagioneSociale.setColumns(10);

		btnCliente = new JButton("...");
		btnCliente.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ClientiSelectionFrame clientiSelectionFrame = new ClientiSelectionFrame("Clienti",desktop,thisCallerClientiSelection);
				desktop.add(clientiSelectionFrame);
				clientiSelectionFrame.setVisible(true);
				clientiSelectionFrame.moveToFront();
			}
		});
		btnCliente.setBounds(452, 0, 26, 23);
		panelCliente.add(btnCliente);
		panelTecnico.setBounds(10, 224, 620, 170);
		getContentPane().add(panelTecnico);
		panelTecnico.setLayout(null);

		lblTipologie = new JLabel("Tipologie");
		lblTipologie.setBounds(0, 4, 75, 14);
		panelTecnico.add(lblTipologie);

		scrollPaneTipologie = new JScrollPane();
		scrollPaneTipologie.setBounds(52, 2, 395, 154);
		panelTecnico.add(scrollPaneTipologie);

		PermessoController pc = new PermessoController();
		permessiLista = pc.getPermessoList();

		if(!edit)
		{
			setPermessiDefaultOperatori();
			model = new TableModel(getDataTablePermessi(),getHeaderTablePermessi());
			tablePermessi = new JTable(model);
			assegnaEventoTable(tablePermessi);
			scrollPaneGruppi.setViewportView(tablePermessi);
			modelTipologie = new TableModel(getDataTableTipologie(),getHeaderTableTipologie());
			tableTipologie = new JTable(modelTipologie);
			assegnaEventoTable(tableTipologie);
			scrollPaneTipologie.setViewportView(tableTipologie);
		}
		else
		{
			cmbGruppo.setEnabled(false);
		}

	}

	private void setPermessiTable()
	{
		TableModel model = new TableModel(getDataTablePermessi(),getHeaderTablePermessi());
		tablePermessi = new JTable(model);
		assegnaEventoTable(tablePermessi);
		scrollPaneGruppi.setViewportView(tablePermessi);
	}

	private void setTipologieTable()
	{
		modelTipologie = new TableModel(getDataTableTipologie(),getHeaderTableTipologie());
		tableTipologie = new JTable(modelTipologie);
		assegnaEventoTable(tableTipologie);
		scrollPaneTipologie.setViewportView(tableTipologie);
	}

	private void setPermessiDefaultOperatori() {
		permessi = new ArrayList<Permesso>();
		permessi.add(permessiLista.get(0));
		permessi.add(permessiLista.get(1));
		permessi.add(permessiLista.get(2));
		permessi.add(permessiLista.get(4));
		permessi.add(permessiLista.get(5));
		permessi.add(permessiLista.get(6));
		permessi.add(permessiLista.get(7));
		setPermessiTable();
	}

	private void setPermessiDefaultTecnici() {
		permessi = new ArrayList<Permesso>();
		permessi.add(permessiLista.get(3));
		permessi.add(permessiLista.get(5));
		setPermessiTable();
	}

	private void setPermessiDefaultClienti() {
		permessi = new ArrayList<Permesso>();
		permessi.add(permessiLista.get(1));
		permessi.add(permessiLista.get(4));
		permessi.add(permessiLista.get(5));
		permessi.add(permessiLista.get(6));
		setPermessiTable();
	}

	private void setPermessiDefaultAmministratori() {
		permessi = new ArrayList<Permesso>();
		permessi.add(permessiLista.get(8));
		setPermessiTable();
	}

	private String[] getHeaderTablePermessi()
	{
		String[] columnName = {"Permesso","Abilitazione"};
		return columnName;
	}

	private Object[][] getDataTablePermessi()
	{
		List<Object[]> data = new ArrayList<Object[]>();
		for(Permesso permesso: permessiLista){
			boolean containsUtente = false;
			for(Permesso permessoUtente:permessi)
			{
				if (permessoUtente.getPermessoEnum()==permesso.getPermessoEnum())
					containsUtente=true;
			}
			Object[] gruppoArray = {permesso.getDescrizione(),containsUtente};
			data.add(gruppoArray);
		}
		return data.toArray(new Object[0][0]);
	}

	private String[] getHeaderTableTipologie()
	{
		String[] columnName = {"Descrizione","Abilitazione"};
		return columnName;
	}

	private Object[][] getDataTableTipologie()
	{
		TipologiaDispositivoController tdc = new TipologiaDispositivoController();
		tipologieLista = tdc.getTipologiaDispositivoList();
		List<Object[]> data = new ArrayList<Object[]>();
		for(TipologiaDispositivo tipologia: tipologieLista){
			boolean containsTipologia = false;
			if (tipologie!=null){
				for(TipologiaDispositivo tipologiaUtente:tipologie)
				{
					if (tipologiaUtente.getIdTipologiaDispositivo()==tipologia.getIdTipologiaDispositivo())
						containsTipologia=true;
				}
			}
			Object[] gruppoArray = {tipologia.getDescrizione(),containsTipologia};
			data.add(gruppoArray);
		}
		return data.toArray(new Object[0][0]);
	}

	public void setUtente(Utente utente)
	{
		this.utente=utente;
		txtNomeUtente.setText(utente.getNomeUtente());
		txtNomeUtente.setEditable(false);
		txtPassword.setText(utente.getPassword());
		txtCognome.setText(utente.getCognome());
		txtNome.setText(utente.getNome());
		txtTelefono.setText(utente.getTelefono());
		txtCellulare.setText(utente.getCellulare());
		chkAbilitato.setEnabled(utente.getAbilitazione());
		switch (utente.getGruppo())
		{
		case OPERATORI:
			cmbGruppo.setSelectedIndex(0);
			break;
		case TECNICI:
			cmbGruppo.setSelectedIndex(1);
			panelTecnico.setVisible(true);
			panelCliente.setVisible(false);
			tipologie = ((Operatore)utente).getTipologieDispositivi();
			setTipologieTable();
			break;
		case CLIENTI:
			cmbGruppo.setSelectedIndex(2);
			panelTecnico.setVisible(false);
			panelCliente.setVisible(true);
			clienteSelected = ((Cliente)utente);
			txtRagioneSociale.setText(((Cliente) utente).getRagioneSociale());
			break;
		case AMMINISTRATORI:
			cmbGruppo.setSelectedIndex(3);
			break;
		}
		permessi = utente.getPermessi();
		setPermessiTable();
	}

	public void assegnaEventoTable(JTable jtable)
	{
		jtable.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				JTable target = (JTable)e.getSource();
				if ((target.getSelectedColumn() == 1)&&(((String)target.getValueAt(target.getSelectedRow(), 0)).equals(GruppoUtentiEnum.CLIENTI.toString()))) {
					btnCliente.setEnabled((Boolean) target.getValueAt(target.getSelectedRow(), 1));
				}
				if ((target.getSelectedColumn() == 1)&&(((String)target.getValueAt(target.getSelectedRow(), 0)).equals(GruppoUtentiEnum.TECNICI.toString()))) {
					tableTipologie.setEnabled((Boolean) target.getValueAt(target.getSelectedRow(), 1));
				}
			}
		});
	}

	@Override
	public void setClienteSelection(Cliente cliente) {
		this.clienteSelected=cliente;
		txtRagioneSociale.setText(cliente.getRagioneSociale());
	}
}
